export {};
// 1. 什么是接口 ？  


// 2. 作用： 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。


// 3. 用法：
// 3-1. 对象键值对结构
interface ObjState {
  // 必须属性
  name: string
  age: number
  // 可选属性
  sex?: string
  // 只读属性
  readonly code: number
  // 其他任意属性
  [propsName: string]: any
}

const obj: ObjState = {
  age: 20,
  name: '李四',
  sex: '男',
  code: 12345,
  abc: 123,
  bool: true
}

const o: ObjState = {
  age: 33,
  name: '张三',
  code: 54321
}

// 3-2 函数类型
interface FnFcun {
  (x: number, y: number) : number
}

const fn: FnFcun = (x: number, y: number): number => x + y

// 3-3 索引类型
interface ArrState {
  [propsName: number]: boolean | /*  | 代表联合类型*/ number
}

const arr: number[] = [1,2,3,4]
const arr1: ArrState = [true, false, 123]


// 4. 类 类型
interface SonState {
  name: string
  age: number
}

// 实现接口
class Son implements SonState {
  // 实例
  name: string;
  age: number;
  // 构造器
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  sayName() {
    console.log(`我是${this.name}, 今年${this.age}岁了， 我不是渣，我只是想给每个女孩一个家`)
  }
}

// 类必须通过new操作符实例化
const s1 = new Son("张三", 20);
const s2 = new Son('李四', 33)
s1.sayName()
s2.sayName()

console.log(s1, s2)

